//
//  ACNetworkBody.h
//  ACFramework
//
//  Created by caoyq on 2018/11/12.
//  Updated by caoyq on 2019/1//11.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class ACResponseBody;

typedef NS_ENUM(NSInteger, ACMethodType)
{
    ACMethodTypePost = 0,
    ACMethodTypeGet,
    ACMethodTypeDownload,
    ACMethodTypeUpload
};

typedef NS_ENUM(NSInteger, ACRequestType)
{
    ACRequestTypeJSON = 0,   /**< 传入参数转化为json格式 */
    ACRequestTypePlainText   /**< 普通text/html */
};

typedef NS_ENUM(NSInteger, ACUploadType)
{
    ACUploadTypeImage = 0,
    ACUploadTypeMovie
};

typedef void (^ACResponseSuccessBlock)(id _Nullable responseObject);
typedef void (^ACResponseFailureBlock)(NSError * _Nullable error);
///进度block，回传 已完成量与总量
typedef void (^ACResponseProgressBlock)(int64_t completedUnitCount, int64_t totalUnitCount);
//别名
typedef ACResponseProgressBlock ACDownloadProgressBlock;
typedef ACResponseProgressBlock ACUploadProgressBlock;
typedef NSURLSessionTask        ACURLSessionTask;

/**
 * 请求体
 */
@interface ACRequestBody : NSObject

/************* 基本参数 *************/

/** 请求方式 */
@property (nonatomic, assign) ACMethodType  methodType;
/** 请求参数的格式，决定后面需不需转化为json */
@property (nonatomic, assign) ACRequestType requestType;
/** 请求的参数 */
@property (nonatomic, strong) NSDictionary  *parameters;
/** 请求的完整URL，字符串类型 */
@property (nonatomic, strong) NSString      *url;
/**
 * 所有需要写入请求头中的数据，比如在请求头中设置token等。
 *
 * [manager.requestSerializer setValue:@"" forHTTPHeaderField:@""]
 */
@property (nonatomic, strong) NSDictionary  *allHeaderFields;


/************* 上传相关 *************/

/** 上传文件的类型 */
@property (nonatomic, assign) ACUploadType uploadType;
/** 待上传文件的二进制数据 */
@property (nonatomic, strong) NSData       *fileData;
/** 待上传文件的路径，在fileData存在时不生效 */
@property (nonatomic, strong) NSURL        *fileURL;
/** 上传后文件保存的名字 */
@property (nonatomic, strong) NSString     *fileName;
/** 文件mimeType，图片默认为@"image/png" */
@property (nonatomic, strong) NSString     *mimeType;


/************* 下载相关 *************/

/** 下载的文件保存路径，目前文件名用文件原名 */
@property (nonatomic, strong) NSString     *fileSavePath;


/************* 统一回调 *************/

/** 请求成功回调 */
@property (nonatomic, copy) ACResponseSuccessBlock  successBlock;
/** 请求失败回调 */
@property (nonatomic, copy) ACResponseFailureBlock  failureBlock;
/** 下载进度回调 */
@property (nonatomic, copy) ACDownloadProgressBlock downloadProgressBlock;
/** 上传进度回调 */
@property (nonatomic, copy) ACUploadProgressBlock   uploadProgressBlock;


/************* 回收处理 *************/

/** 当前请求所在的控制器名 */
@property (nonatomic, strong) NSString *requestVCName;
/** 是否自动取消请求，默认为YES，即在控制器消失时自动取消未完成的请求，requestVCName存在时默认为YES，不存在时默认为NO */
@property (nonatomic, assign) BOOL     isAutoCancelRequest;

@end

/**
 * 响应体
 */
@interface ACResponseBody : NSObject

@property (nonatomic, assign) NSInteger errorCode;
@property (nonatomic, strong) NSString  *errorDesc;

@property (nonatomic, strong) NSError   *error;

@end
